--- /dev/null
+c4b8e6f83f3e207ff57259307bdb4fc6e49b5881
+diff --git a/util.c b/util.c
+index 92fd724..3412d6b 100644
+--- a/util.c
++++ b/util.c
+@@ -968,8 +968,15 @@ endian_read_double(void* ptr, int read_le)
+ }
+ p = r;
+ }
+-
++
++// Word order is different on arm, but not on arm-eabi.
++#if defined(__arm__) && !defined(__ARM_EABI__)
++ memcpy(&ret, p + 4, 4);
++ memcpy(((void *)&ret) + 4, p, 4);
++#else
+ memcpy(&ret, p, 8);
++#endif
++
+ return ret;
+ }
+
+@@ -999,12 +1006,20 @@ endian_read_float(void* ptr, int read_le)
+ void
+ endian_write_double(void* ptr, double d, int write_le)
+ {
+- char *r = (char *)(void *)&d;
+ int i;
+ char *optr = ptr;
++// Word order is different on arm, but not on arm-eabi.
++#if defined(__arm__) && !defined(__ARM_EABI__)
++ char r[8];
++ memcpy( r + 4, &d, 4);
++ memcpy( r, ((void *)&d) + 4, 4);
++#else
++ char *r = (char *)(void *)&d;
++#endif
++
+
+ if ( i_am_little_endian == write_le ) {
+- memcpy( ptr, &d, 8);
++ memcpy( ptr, r, 8);
+ }
+ else {
+ for (i = 0; i < 8; i++)